import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.Random;
import java.util.List;
/**
 * Write a description of class Escenario here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Escenario extends World
{
public static int Speed;
public static int Started;
private int cont=50,cont2=0,cont3=0,cont4=0,a=0;
private Random r = new Random();
private int nivel=1,time=0;
private Heroe hero;
public Score score = new Score(1);
public int muerte=0;
public java.util.List li;
public Bstart start= new Bstart();
public Bcre creditos = new Bcre();
public Ayuda ayuda = new Ayuda();
public Menu menu = new Menu();
int ju=0;
    /**
     * Constructor for objects of class Escenario.
     * 
     */
    public void act()
    {
        if(ju==1)
         juego();
        else
        { 
         if(Greenfoot.mousePressed(start))
         {
          removeObject(menu);
          removeObject(start);
          removeObject(ayuda);
          removeObject(creditos);
          nivel0();
          ju=1;
         }
         if(Greenfoot.mousePressed(ayuda))
         {
          addObject(new Ins(), 280, 300 );
         }
         if(Greenfoot.mousePressed(creditos))
         {
          addObject(new Creditos(), 280, 300 );
         }
        }
    }
    
    /**
     * Contructor del Escenario
     * Se llama el objeto menu, los botones necesarios del menu
     * y se llama el metodo Greenfoot.start para empezar.
     */
    public Escenario()
    
    {    
        super(600, 800, 1);
        //Greenfoot.playSound("Harlem Shake - Full Song.M4A");
        addObject(menu, 290, 300 );
        addObject(start , 150, 328 );
        addObject(ayuda , 150, 395 );
        addObject(creditos , 180, 460 );
        Greenfoot.start();
    }
    
    /**
     * Metodo en el cual se llaman los diferentes niveles del juego
     */
    public void juego()
    {
        switch(nivel)
        {
            case 1:
                nivel1();
                break;
            case 2:
                nivel2();
                break;
            case 3:
                nivel3();
                break;
            case 4:
                nivel4();
                break;
        }
        switch(time) //Con este switch se verifican los tiempos necesarios para cambiar de nivel y se llaman las imagenes de cada nivel
        {
            case 20:
                addObject(new Nivel2(), getWidth() /2, getHeight() /2 );
                nivel=2;
                break;
            case 45:
                addObject(new Nivel3(), getWidth() /2, getHeight() /2 );
                nivel=3;
                break;
            case 70:
                nivel=4;
                break;
        }
        li=getObjects(Heroe.class); 
        if(li.isEmpty()) //Se verifica si aun se encuentra el heroe vivo, en caso de no estarlo se reinicia el score a 0
        {
            score.band=0;
        }
    }
    
    /**
     * Metodo para inicializar el juego
     */
    public void nivel0()
    {
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
         
         
         addObject(new Nivel1(), getWidth() /2, getHeight() /2 );
         addObject(hero = new Heroe(), 100, 30 );
         addObject(score, 0, 0 );

         addObject( new PlataformaEstatica(), 100, 130 );

    }
    

    public void muerte1()
    {
        muerte=1;
    }
    
    /**
     * Metodo para inicializar el nivel 1, se llaman los diferentes objetos que apareceran en dicho nivel
     */
    public void nivel1()
    {
        int ran=r.nextInt(4);
        if(cont>=200)
        {
         switch(ran)
         {
             case 0:
                addObject( new PlataformaEstatica(), 80, 0 );
                break;
             case 1:
                addObject( new PlataformaEstatica(), 160, 0 );
                break;
             case 2:
                addObject( new PlataformaEstatica(), 250, 0 );
                break;
             case 3:
                addObject( new PlataformaEstatica(), 460, 0 );
                break;
         }
 
         cont=0;
         time++;
        }
        if(cont2>=600) //Cuando el contador llga a 600 aparece un enemigo de manera aleatoria 
        {
            addObject( new Enemigo(), 100*ran, 30 );
            cont2=0;
        }
        cont++;
        cont2++;
    }
    
    /**
     * Metodo para inicializar el nivel 2, se llaman los diferentes objetos que apareceran en dicho nivel
     */
    public void nivel2()
    {
        int ran=r.nextInt(4);
        if(cont>=200)
        {
         switch(ran)
         {
             //Cada Case tiene dentro un if el cual se utliza para seleccionar que plataforma aparecera, ya sea Estatica o fragil
             case 0:
                if(a%2==0)
                 addObject( new PlataformaEstatica(), 80, 0 );
                else
                 addObject( new PlataformaFragil(), 80, 0 );
                break;
             case 1:
                if(a%2==0)
                 addObject( new PlataformaEstatica(), 200, 0 );
                else
                 addObject( new PlataformaFragil(), 200, 0 );
                break;
             case 2:
                if(a%2==0)
                 addObject( new PlataformaEstatica(), 300, 0 );
                else
                 addObject( new PlataformaFragil(), 300, 0 );
                break;
             case 3:
                if(a%2==0)
                 addObject( new PlataformaEstatica(), 460, 0 );
                else
                 addObject( new PlataformaFragil(), 460, 0 );
                break;
         }
         cont=0;
         time++;
        }
        if(cont2>=400)//Cuando el contador llega a 400 aparece un enemigo de manera aleatoria
        {
            addObject( new Enemigo(), 100*ran, 30 );
            cont2=0;
        }
        if(cont3>=600)//Cuando el contador llega a 600 aparece un Enemigo2 de manera aleatoria
        {
            addObject( new Enemigo2(), 100*ran, 30 );
            cont3=0;
        }
        a++;
        cont++;
        cont2++;
        cont3++;
    }
    
     /**
     * Metodo para inicializar el nivel 3, se llaman los diferentes objetos que apareceran en dicho nivel
     */
    public void nivel3()
    {
        int ran=r.nextInt(4);
        if(cont>=200)
        {
         switch(ran)
         {
             case 0:
                if(a%2==0)
                 addObject( new PlataformaEstatica(), 80, 0 );
                else
                 addObject( new PlataformaFragil(), 80, 0 );
                break;
             case 1:
                if(a%2==0)
                 addObject( new PlataformaEstatica(), 200, 0 );
                else
                 addObject( new PlataformaFragil(), 200, 0 );
                break;
             case 2:
                if(a%2==0)
                 addObject( new PlataformaEstatica(), 300, 0 );
                else
                 addObject( new PlataformaFragil(), 300, 0 );
                break;
             case 3:
                if(a%2==0)
                 addObject( new PlataformaEstatica(), 460, 0 );
                else
                 addObject( new PlataformaFragil(), 460, 0 );
                break;
         }

         cont=0;
         time++;
        }
        if(cont3>=600)//Cuando el contador llega a 600 aparece un Enemigo2
        {
            addObject( new Enemigo2(), 180*ran, 30 );
            cont3=0;
        }
        if(cont2>=500)//Cuando el contador llega a 500  aparece un Enemigo
        {
            addObject( new Enemigo(), 100*ran, 30 );
            cont2=0;
        }
        if(cont4>=700)//Cuando el contador llega a 700 Aparece una plataforma dinamica, una plataforma fragil y un Enemigo1 el cual lanza barriles.
        {
            addObject( new PlataformaDinamica(), 300, 799 );
            addObject( new PlataformaFragil(), 10, 10 );
            addObject( new Enemigo1(), 10, 0 );
            cont4=0;
        }
        cont++;
        cont2++;
        cont3++;
        cont4++;
    }
    
    /**
     * Metodo que inicializa la imagen y el sonido indicando que se gano el juego
     */
    public void nivel4()
    {
        removeObject(hero);
        addObject(new GameOver(),250,300);
        Greenfoot.playSound("win.wav");
    }
}
